package servlet;

import util.StringUtil;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Arrays;

/**
 * Author:shixiaojun@itany.com
 * Date:2022/4/8 15:00
 * Version:1.0-SNAPSHOT
 * Description: 实现添加员工的功能
 */
@WebServlet("/addEmp")
public class AddEmpServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        // request中提供两种获取前台数据的方法
        // 方法一:String value = request.getParameter("key");
        // 根据指定的key获取对应的数据
        // 其中key是请求中数据的key(即:表单元素的name属性值)
        // value是请求中数据的value(即:用户输入的具体数据)
        // 方法的返回值是一个字符串,因此,该方法只能接收单一数据

        // 方法二:String[] value = request.getParameterValues("key");
        // 根据指定的key获取对应的数据
        // 其中key是请求中数据的key(即:表单元素的name属性值)
        // value是请求中数据的value(即:用户输入的具体数据)
        // 方法的返回值是一个字符串数组,因此,可以接收非单一的数据,例如:多选框

        // 在获取请求中的数据的时候,存在中文乱码问题
        // 这个乱码问题称之为请求乱码
        // 该乱码根据请求方式的不同,处理的方式也不同
        // 1.POST请求乱码
        // request.setCharacterEncoding("编码")
        // 告诉服务器,以什么样的编码对请求中的数据进行解析
        request.setCharacterEncoding("utf-8");
        String name = request.getParameter("name");
        // 2.GET请求乱码
        // GET请求处理数据的编码是由tomcat指定的
        // 不同版本的tomcat指定的编码也可能不一样
        // 一般使用的是ISO-8859-1的编码进行解析
        // 因此,我们可以使用两种方式解决GET请求乱码
        // 方式一:在代码中对字符串进行转码
        // name = new String(name.getBytes("ISO-8859-1"),"UTF-8");
        // 方式二:由于GET请求处理的编码是由服务器指定的
        // 我们可以通过服务的配置文件修改默认编码
        // 打开tomcat安装目录下的conf目录中server.xml
        // 找到端口号配置所在的标签中
        // 添加一个字符集配置属性URIEncoding="指定编码"
        // 属性名大小写敏感
        String salary = request.getParameter("salary");
        String gender = request.getParameter("gender");
        String edu = request.getParameter("edu");
        String[] hobbies = request.getParameterValues("hobbies");
        System.out.println("name:"+name+",salary:"+salary+",gender:"+gender+",edu:"+edu+",hobbies:"+ Arrays.toString(hobbies));


        // 使用JDBC访问数据的方式将对应的员工信息插入到数据库中
        Connection conn = null;
        PreparedStatement ps = null;
        String url = "jdbc:mysql://127.0.0.1:3306/web?useUnicode=true&characterEncoding=utf-8";
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(url,"root","");

            String sql = new StringBuffer()
                    .append(" insert into ")
                    .append(" t_emp ")
                    .append("   (name,salary,gender,edu,hobbies)")
                    .append(" values ")
                    .append("   (?,?,?,?,?)")
                    .toString();
            ps = conn.prepareStatement(sql);
            ps.setString(1,name);
            ps.setDouble(2,Double.parseDouble(salary));
            ps.setString(3,gender);
            ps.setString(4,edu);
            // 数据库中保存的是字符串,但是此时获取的数据是一个数组
            // 因此,需要通过一定的方式将指定的数组转换成字符串
            // 此处可以通过逗号对数组的元素进行拼接
            ps.setString(5, StringUtil.arrayToString(hobbies));
            ps.executeUpdate();

            // out.print("<h1 style='color:green;'>恭喜您,添加成功</h1>");
            // 当添加成功之后页面自动跳转到员工列表界面
            // Servlet提供的页面跳转共有两种方式
            // 1.重定向
            // response.sendRedirect(完整uri地址)
            // URL:http://localhost:8080/web/findAll
            // 端口号后面的地址称之为uri地址
            // URI:/web/findAll
            // response.sendRedirect("/web/findAll");
            // 由于应用名/web并不是固定的
            // 开发人员在使用应用名的时候不能写死
            // 我们需要通过代码来获取对应的应用名
            // String contextPath = request.getContextPath();
            // System.out.println("当前应用名:"+contextPath);
            // 在代码中使用到当前应用名的时候,需要通过方法去获取
            // response.sendRedirect(request.getContextPath()+"/findAll");

            // 2.转发
            // request.getRequestDispatcher(访问命令,不需要应用名).forward(request,response)
            // 转发属于服务器内部控制权的转移
            // 无法跳转到当前工程以外的服务地址
            // 转发时不需要指定应用名
            // 调用者无法看到地址的变化
            // request.getRequestDispatcher("/findAll").forward(request,response);

            // 建议:
            // 1.当执行增删改操作的时候,使用重定向(入门级建议,后期会有其他情况)
            // 2.当执行查询操作的时候,使用转发
            response.sendRedirect(request.getContextPath()+"/findAll");
//            response.sendRedirect("https://www.baidu.com/");
            // HTTP Status 404 - /web/https:/www.baidu.com
//            request.getRequestDispatcher("https://www.baidu.com").forward(request,response);

        } catch (Exception e) {
            e.printStackTrace();
            out.print("<h1 style='color:red;'>对不起,添加失败,失败原因为:"+e.getMessage()+"</h1>");
        }
    }

}
